package org.yi.spider.utils;

public class Native2AsciiUtils {
	/**
     * prefix of ascii string of native character
     */ 
    private static String PREFIX = "\\u"; 
   
    /**
     * Native to ascii string. It's same as execut native2ascii.exe.
     * @param str native string
     * @return ascii string
     */ 
    public static String native2Ascii(String str) { 
        char[] chars = str.toCharArray(); 
        StringBuilder sb = new StringBuilder(); 
        for (int i = 0; i < chars.length; i++) { 
            sb.append(char2Ascii(chars[i])); 
        } 
        return sb.toString(); 
    } 
   
    /**
     * Native character to ascii string.
     * @param c native character
     * @return ascii string
     */ 
    private static String char2Ascii(char c) { 
        if (c > 255) { 
            StringBuilder sb = new StringBuilder(); 
            sb.append(PREFIX); 
            int code = (c >> 8); 
            String tmp = Integer.toHexString(code); 
            if (tmp.length() == 1) { 
                sb.append("0"); 
            } 
            sb.append(tmp); 
            code = (c & 0xFF); 
            tmp = Integer.toHexString(code); 
            if (tmp.length() == 1) { 
                sb.append("0"); 
            } 
            sb.append(tmp); 
            return sb.toString(); 
        } else { 
            return Character.toString(c); 
        } 
    } 
   
    /**
     * Ascii to native string. It's same as execut native2ascii.exe -reverse.
     * @param str ascii string
     * @return native string
     */ 
    public static String ascii2Native(String str) { 
        StringBuilder sb = new StringBuilder(); 
        int begin = 0; 
        int index = str.indexOf(PREFIX); 
        while (index != -1) { 
            sb.append(str.substring(begin, index)); 
            sb.append(ascii2Char(str.substring(index, index + 6))); 
            begin = index + 6; 
            index = str.indexOf(PREFIX, begin); 
        } 
        sb.append(str.substring(begin)); 
        return sb.toString(); 
    } 
   
    /**
     * Ascii to native character.
     * @param str ascii string
     * @return native character
     */ 
    private static char ascii2Char(String str) { 
        if (str.length() != 6) { 
            throw new IllegalArgumentException( 
                    "Ascii string of a native character must be 6 character."); 
        } 
        if (!PREFIX.equals(str.substring(0, 2))) { 
            throw new IllegalArgumentException( 
                    "Ascii string of a native character must start with \"\\u\"."); 
        } 
        String tmp = str.substring(2, 4); 
        int code = Integer.parseInt(tmp, 16) << 8; 
        tmp = str.substring(4, 6); 
        code += Integer.parseInt(tmp, 16); 
        return (char) code; 
    }

    public static void main(String[] args){
    	String test = "\u4e00\u60f3\u5230\u5f53\u65f6\u300a\u8f69\u8f95\u5fa1\u9f99\u51b3\u300b\u8fd0\u8f6c\u901f\u5ea6\u52a0\u5feb\uff0c";
    	System.out.println(ascii2Native(test));
    }
}
